<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>中俊为 | we harmonyos</title>
    <meta name="generator" content="VuePress 1.9.7">
    <script>
          var _hmt = _hmt || [];
          (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?39485dba914ae63b24732b6a90688f0b";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
          })();
      </script>
    <link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials">
    <meta name="description" content="weharmonyos 鸿蒙论坛 鸿蒙注释 开源鸿蒙 鸿蒙源码 openharmony源码 HarmonyOS源码 HarmonyOS HarmonyOS生态 openharmony开发者文档 鸿蒙生态 鸿蒙系统 华为操作系统 鸿蒙研究站 开放原子开源基金会 百万汉字注解鸿蒙 百篇博客分析鸿蒙">
    <meta property="og:url" content="/blog/20.html">
    <meta property="og:site_name" content="中俊为 | we harmonyos">
    <meta property="og:description" content="本篇关键词：、、、 下载 &gt;&gt; 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf.zip) 进程管理相关篇为: v11.04 鸿蒙内核源码分析(调度故事) | 大郎，该喝药了; v12.03 鸿蒙内核源码分析(进程控制块) | 可怜天下父母心; v13.01 鸿蒙内核源码分析(进程空间) | 有爱的地方才叫家 ; v14.01 鸿蒙内">
    <meta property="og:type" content="article">
    <meta property="og:locale" content="en-US">
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:image:alt" content="中俊为 | we harmonyos">
    <meta name="theme-color" content="#46bd87">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
    
    <link rel="preload" href="/assets/css/0.styles.087eb7d3.css" as="style"><link rel="preload" href="/assets/js/app.9a8b95d8.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Layout.c1e797d4.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.f75cf258.js" as="script"><link rel="preload" href="/assets/js/page--5bc7d548.eda26865.js" as="script"><link rel="prefetch" href="/assets/js/160.a8046d43.js"><link rel="prefetch" href="/assets/js/161.29f8564f.js"><link rel="prefetch" href="/assets/js/162.249ee491.js"><link rel="prefetch" href="/assets/js/163.c57d1577.js"><link rel="prefetch" href="/assets/js/164.7a788aaa.js"><link rel="prefetch" href="/assets/js/165.c333afb2.js"><link rel="prefetch" href="/assets/js/166.9bcb7cd6.js"><link rel="prefetch" href="/assets/js/layout-Blog.4a9781d1.js"><link rel="prefetch" href="/assets/js/layout-Layout.7e277e0b.js"><link rel="prefetch" href="/assets/js/layout-NotFound.9326b14e.js"><link rel="prefetch" href="/assets/js/layout-Slide.8dd861e4.js"><link rel="prefetch" href="/assets/js/page--00854288.e2bc8e8a.js"><link rel="prefetch" href="/assets/js/page--00f8db0a.b2a35fe6.js"><link rel="prefetch" href="/assets/js/page--03ad6df0.d48f4c19.js"><link rel="prefetch" href="/assets/js/page--04b12ba8.e8add78d.js"><link rel="prefetch" href="/assets/js/page--070d2528.d24cd503.js"><link rel="prefetch" href="/assets/js/page--086560f0.a6be2844.js"><link rel="prefetch" href="/assets/js/page--090ad32d.fc7da3c3.js"><link rel="prefetch" href="/assets/js/page--0c054030.2886024e.js"><link rel="prefetch" href="/assets/js/page--0d9507c8.a27dee03.js"><link rel="prefetch" href="/assets/js/page--10bd3330.b5165172.js"><link rel="prefetch" href="/assets/js/page--1233b0b2.b5caca9c.js"><link rel="prefetch" href="/assets/js/page--13650e88.61330a2b.js"><link rel="prefetch" href="/assets/js/page--14c850b1.d9a40c31.js"><link rel="prefetch" href="/assets/js/page--15752630.25f9c756.js"><link rel="prefetch" href="/assets/js/page--19150570.58df8995.js"><link rel="prefetch" href="/assets/js/page--19ecf128.130d012b.js"><link rel="prefetch" href="/assets/js/page--1c48eaa8.9a689e30.js"><link rel="prefetch" href="/assets/js/page--1d4dfe96.bd551921.js"><link rel="prefetch" href="/assets/js/page--1dccf870.03d7d9cc.js"><link rel="prefetch" href="/assets/js/page--2074d3c8.06bf5706.js"><link rel="prefetch" href="/assets/js/page--22213c96.e703257a.js"><link rel="prefetch" href="/assets/js/page--2284eb70.514124de.js"><link rel="prefetch" href="/assets/js/page--22d0cd48.11ea1522.js"><link rel="prefetch" href="/assets/js/page--252cc6c8.f9acae83.js"><link rel="prefetch" href="/assets/js/page--2624cab0.4535fea2.js"><link rel="prefetch" href="/assets/js/page--269ff8f9.012e8ae6.js"><link rel="prefetch" href="/assets/js/page--26fcb668.35b2da5d.js"><link rel="prefetch" href="/assets/js/page--2958afe8.216913bc.js"><link rel="prefetch" href="/assets/js/page--2adcbdb0.6dcb4c27.js"><link rel="prefetch" href="/assets/js/page--2bb4a968.aac31797.js"><link rel="prefetch" href="/assets/js/page--2d849908.7bb4e817.js"><link rel="prefetch" href="/assets/js/page--2e10a2e8.42bef48d.js"><link rel="prefetch" href="/assets/js/page--2f94b0b0.0c993df5.js"><link rel="prefetch" href="/assets/js/page--2fe09288.77769dcb.js"><link rel="prefetch" href="/assets/js/page--323c8c08.254a5f78.js"><link rel="prefetch" href="/assets/js/page--33348ff0.a5f99eb0.js"><link rel="prefetch" href="/assets/js/page--340c7ba8.2c9570cb.js"><link rel="prefetch" href="/assets/js/page--34988588.8c8d0363.js"><link rel="prefetch" href="/assets/js/page--36687528.67d84e0d.js"><link rel="prefetch" href="/assets/js/page--37d6dfd6.88e9cd42.js"><link rel="prefetch" href="/assets/js/page--37ec82f0.5419c82d.js"><link rel="prefetch" href="/assets/js/page--37f7cf15.65f72e55.js"><link rel="prefetch" href="/assets/js/page--38c46ea8.5d5150f9.js"><link rel="prefetch" href="/assets/js/page--3a945e48.bf9758fb.js"><link rel="prefetch" href="/assets/js/page--3ab2204c.e08d6316.js"><link rel="prefetch" href="/assets/js/page--3b206828.d83e3926.js"><link rel="prefetch" href="/assets/js/page--3ca475f0.49e5acce.js"><link rel="prefetch" href="/assets/js/page--3cf057c8.8364331d.js"><link rel="prefetch" href="/assets/js/page--3f4c5148.587a8360.js"><link rel="prefetch" href="/assets/js/page--40445530.486bb516.js"><link rel="prefetch" href="/assets/js/page--411c40e8.2eedba0e.js"><link rel="prefetch" href="/assets/js/page--41a84ac8.f4a360a3.js"><link rel="prefetch" href="/assets/js/page--4220f8b5.19b4371f.js"><link rel="prefetch" href="/assets/js/page--43783a68.4faf0866.js"><link rel="prefetch" href="/assets/js/page--44fc4830.a160662c.js"><link rel="prefetch" href="/assets/js/page--45d433e8.560fef87.js"><link rel="prefetch" href="/assets/js/page--47a42388.052314b4.js"><link rel="prefetch" href="/assets/js/page--47d07816.66731286.js"><link rel="prefetch" href="/assets/js/page--48302d68.8d6493cf.js"><link rel="prefetch" href="/assets/js/page--49b43b30.e3684736.js"><link rel="prefetch" href="/assets/js/page--4a001d08.47f7ec45.js"><link rel="prefetch" href="/assets/js/page--4c5c1688.b7ec1f32.js"><link rel="prefetch" href="/assets/js/page--4d541a70.ee807705.js"><link rel="prefetch" href="/assets/js/page--4e2c0628.4f7105a4.js"><link rel="prefetch" href="/assets/js/page--4eb81008.725d26fe.js"><link rel="prefetch" href="/assets/js/page--5087ffa8.dac2aae0.js"><link rel="prefetch" href="/assets/js/page--520c0d70.2beedefb.js"><link rel="prefetch" href="/assets/js/page--52e3f928.2645087c.js"><link rel="prefetch" href="/assets/js/page--53cd0b44.96d4a285.js"><link rel="prefetch" href="/assets/js/page--54eb2c5e.27eb702b.js"><link rel="prefetch" href="/assets/js/page--553ff2a8.fba8ee4f.js"><link rel="prefetch" href="/assets/js/page--5686ab01.547b633c.js"><link rel="prefetch" href="/assets/js/page--56c40070.4e35708a.js"><link rel="prefetch" href="/assets/js/page--570fe248.2b301b36.js"><link rel="prefetch" href="/assets/js/page--596bdbc8.c74cd724.js"><link rel="prefetch" href="/assets/js/page--5a63dfb0.bbd49a9b.js"><link rel="prefetch" href="/assets/js/page--5f1bd2b0.e02cf88d.js"><link rel="prefetch" href="/assets/js/page--5ff3be68.b2b0e76e.js"><link rel="prefetch" href="/assets/js/page--624fb7e8.666fdc84.js"><link rel="prefetch" href="/assets/js/page--63d3c5b0.b587d38f.js"><link rel="prefetch" href="/assets/js/page--68d79a88.86f62e4d.js"><link rel="prefetch" href="/assets/js/page--6c2b97f0.ed46abea.js"><link rel="prefetch" href="/assets/js/page--6cc6a596.b3827451.js"><link rel="prefetch" href="/assets/js/page--6ea7a148.61a9bc10.js"><link rel="prefetch" href="/assets/js/page--70e38af0.eb8ffc53.js"><link rel="prefetch" href="/assets/js/page--7180d470.73a3a20e.js"><link rel="prefetch" href="/assets/js/page--752f83e8.d5c31640.js"><link rel="prefetch" href="/assets/js/page--778b7d68.5e8e5ea9.js"><link rel="prefetch" href="/assets/js/page--7bb76688.53e305e3.js"><link rel="prefetch" href="/assets/js/page--7c59a86a.ecf88c30.js"><link rel="prefetch" href="/assets/js/page--7df35030.cfa388f4.js"><link rel="prefetch" href="/assets/js/page--7e136008.230e9a15.js"><link rel="prefetch" href="/assets/js/page--89935db0.f79f9e25.js"><link rel="prefetch" href="/assets/js/page--96a322f0.412d537f.js"><link rel="prefetch" href="/assets/js/page--9b5b15f0.a5231547.js"><link rel="prefetch" href="/assets/js/page--a3b2e830.f4ba68fa.js"><link rel="prefetch" href="/assets/js/page--a86adb30.ec08486b.js"><link rel="prefetch" href="/assets/js/page--ad22ce30.4872eca4.js"><link rel="prefetch" href="/assets/js/page--b0c2ad70.8637057e.js"><link rel="prefetch" href="/assets/js/page--b57aa070.43215f9e.js"><link rel="prefetch" href="/assets/js/page--ba329370.b5f22d13.js"><link rel="prefetch" href="/assets/js/page--bdd272b0.aff1d1a9.js"><link rel="prefetch" href="/assets/js/page--c28a65b0.978514c4.js"><link rel="prefetch" href="/assets/js/page--c606edca.49d3396e.js"><link rel="prefetch" href="/assets/js/page--c74258b0.f85195bc.js"><link rel="prefetch" href="/assets/js/page--cae237f0.8a976cc1.js"><link rel="prefetch" href="/assets/js/page--cf9a2af0.7ad20ea2.js"><link rel="prefetch" href="/assets/js/page--d4521df0.a0a74934.js"><link rel="prefetch" href="/assets/js/page--d7f1fd30.160f138a.js"><link rel="prefetch" href="/assets/js/page--dca9f030.9127ab28.js"><link rel="prefetch" href="/assets/js/page--e161e330.34876a6f.js"><link rel="prefetch" href="/assets/js/page--e4f35ef4.690d3ccb.js"><link rel="prefetch" href="/assets/js/page--e501c270.8dc088ee.js"><link rel="prefetch" href="/assets/js/page--e9b9b570.b94764ed.js"><link rel="prefetch" href="/assets/js/page--ea4e0a70.94492571.js"><link rel="prefetch" href="/assets/js/page--ee71a870.b9944792.js"><link rel="prefetch" href="/assets/js/page--f21187b0.d00a5788.js"><link rel="prefetch" href="/assets/js/page--f6c97ab0.ecb91d64.js"><link rel="prefetch" href="/assets/js/page--fb816db0.c1f07c37.js"><link rel="prefetch" href="/assets/js/page--fcf2f51e.71000d71.js"><link rel="prefetch" href="/assets/js/page--ff214cf0.aaa8b0fc.js"><link rel="prefetch" href="/assets/js/page-GN.2f20b55f.js"><link rel="prefetch" href="/assets/js/page-GNFrequentlyAskedQuestions.24e61c26.js"><link rel="prefetch" href="/assets/js/page-GNLanguageandOperation.35e22ff2.js"><link rel="prefetch" href="/assets/js/page-GNQuickStartguide.7cd8e521.js"><link rel="prefetch" href="/assets/js/page-GNReference.1d5d0c6c.js"><link rel="prefetch" href="/assets/js/page-GNSimpleBuildExample.2eb0b7eb.js"><link rel="prefetch" href="/assets/js/page-GNStyleGuide.8a407135.js"><link rel="prefetch" href="/assets/js/page-GNU汇编教程.d208e4d7.js"><link rel="prefetch" href="/assets/js/page-GNvimsyntaxplugin.58d1459e.js"><link rel="prefetch" href="/assets/js/page-GN快速入门.b708bb6a.js"><link rel="prefetch" href="/assets/js/page-Home.97282d71.js"><link rel="prefetch" href="/assets/js/page-HowGNhandlescross-compiling.6ca64957.js"><link rel="prefetch" href="/assets/js/page-Introduction.292088e0.js"><link rel="prefetch" href="/assets/js/page-ninja快速入门.92729e64.js"><link rel="prefetch" href="/assets/js/page-《孙子兵法》全文.402792c5.js"><link rel="prefetch" href="/assets/js/page-《论语》全文.85da0da0.js"><link rel="prefetch" href="/assets/js/page-《诗经》全文.99ebeb52.js"><link rel="prefetch" href="/assets/js/page-《道德经》全文.43627e4e.js"><link rel="prefetch" href="/assets/js/page-两个文档.eb8dd1b7.js"><link rel="prefetch" href="/assets/js/page-主流站点覆盖定期同步更新.1ad02178.js"><link rel="prefetch" href="/assets/js/page-手机版电脑版.b5e8dfea.js"><link rel="prefetch" href="/assets/js/page-捐助方式.6ca91d44.js"><link rel="prefetch" href="/assets/js/page-来源LiteOS和LiteOS-A内核图解.8fa16705.js"><link rel="prefetch" href="/assets/js/page-电脑版手机版.67a0b4a4.js"><link rel="prefetch" href="/assets/js/page-编程语言相关书籍.d9adf7cb.js"><link rel="prefetch" href="/assets/js/page-鸿蒙内核源码分析.bbb451c7.js"><link rel="prefetch" href="/assets/js/vendors~flowchart.46b2de48.js"><link rel="prefetch" href="/assets/js/vendors~mermaid.627fb4be.js"><link rel="prefetch" href="/assets/js/vendors~photo-swipe.cbde97f9.js"><link rel="prefetch" href="/assets/js/vendors~reveal.77b21b7e.js">
    <link rel="stylesheet" href="/assets/css/0.styles.087eb7d3.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container has-navbar has-sidebar has-anchor"><header class="navbar"><!----> <div class="content__navbar-start"></div> <button title="Sidebar Button" class="sidebar-button"><span class="icon"></span></button> <a href="/" class="home-link router-link-active"><!----> <!----> <span class="site-name can-hide">中俊为 | we harmonyos</span></a> <!----> <div class="content__navbar-center"></div> <div class="links"><button tabindex="-1" aria-hidden="true" class="color-button"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="skin-icon"><path d="M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4
        38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32
        51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0
        102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2
        6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4
        0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2
        9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224
        419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4
        470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0
        22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6
        12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128
        505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2
        16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8
        86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4
        80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6
        6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"></path></svg> <div class="color-picker-menu" style="display:none;"><div class="theme-options"><ul class="themecolor-select"><label for="themecolor-select">Theme Color:</label> <li><span class="default-theme"></span></li> </ul> <div class="darkmode-toggle"><label for="darkmode-toggle" class="desc">Theme Mode:</label> <div class="darkmode-switch"><div class="item day"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon light-icon"><path d="M512 256a42.667 42.667 0 0 0 42.667-42.667V128a42.667 42.667 0 0 0-85.334 0v85.333A42.667 42.667 0 0 0 512 256zm384 213.333h-85.333a42.667 42.667 0 0 0 0 85.334H896a42.667 42.667 0 0 0 0-85.334zM256 512a42.667 42.667 0 0 0-42.667-42.667H128a42.667 42.667 0 0 0 0 85.334h85.333A42.667 42.667 0 0 0 256 512zm9.387-298.667a42.667 42.667 0 0 0-59.307 62.72l61.44 59.307a42.667 42.667 0 0 0 31.147 11.947 42.667 42.667 0 0 0 30.72-13.227 42.667 42.667 0 0 0 0-60.16zm459.946 133.974a42.667 42.667 0 0 0 29.44-11.947l61.44-59.307a42.667 42.667 0 0 0-57.6-62.72l-61.44 60.587a42.667 42.667 0 0 0 0 60.16 42.667 42.667 0 0 0 28.16 13.227zM512 768a42.667 42.667 0 0 0-42.667 42.667V896a42.667 42.667 0 0 0 85.334 0v-85.333A42.667 42.667 0 0 0 512 768zm244.48-79.36a42.667 42.667 0 0 0-59.307 61.44l61.44 60.587a42.667 42.667 0 0 0 29.44 11.946 42.667 42.667 0 0 0 30.72-12.8 42.667 42.667 0 0 0 0-60.586zm-488.96 0-61.44 59.307a42.667 42.667 0 0 0 0 60.586 42.667 42.667 0 0 0 30.72 12.8 42.667 42.667 0 0 0 28.587-10.666l61.44-59.307a42.667 42.667 0 0 0-59.307-61.44zM512 341.333A170.667 170.667 0 1 0 682.667 512 170.667 170.667 0 0 0 512 341.333z" fill="currentColor"></path></svg></div> <div class="item auto active"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon auto-icon"><path d="M460.864 539.072H564.8L510.592 376l-49.728 163.072zM872 362.368V149.504H659.648L510.528 0l-149.12 149.504H149.12v212.928L0 511.872l149.12 149.504v212.928h212.352l149.12 149.504 149.12-149.504h212.352V661.376l149.12-149.504L872 362.368zM614.464 693.12l-31.616-90.624H438.272l-31.616 90.624h-85.888l144.576-407.68h90.368l144.576 407.68h-85.824zm0 0" fill="currentColor"></path></svg></div> <div class="item night"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon dark-icon"><path d="M935.539 630.402c-11.43-11.432-28.674-14.739-43.531-8.354-46.734 20.103-96.363 30.297-147.508 30.297-99.59 0-193.221-38.784-263.64-109.203-108.637-108.637-139.61-270.022-78.908-411.148a39.497 39.497 0 0 0-51.886-51.887c-52.637 22.64-100.017 54.81-140.826 95.616-85.346 85.346-132.346 198.821-132.346 319.52 0 120.7 47.001 234.172 132.347 319.519S408.063 947.11 528.76 947.11c120.7 0 234.172-47.003 319.52-132.351 40.809-40.81 72.978-88.19 95.616-140.826a39.497 39.497 0 0 0-8.356-43.532z" fill="currentColor"></path></svg></div></div> <!----></div></div></div></button> <div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link router-link-active"><!---->
  首页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="文档中心" class="dropdown-title"><span class="title"><!---->
        文档中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/readme/Readme-CN.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  子系统
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/device-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  南向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/application-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  北向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="博客中心" class="dropdown-title"><span class="title"><!---->
        博客中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="/blog/101.html" class="nav-link"><!---->
  总目录
</a></li><li class="dropdown-item"><a href="/blog/index/1_base.html" class="nav-link"><!---->
  基础知识
</a></li><li class="dropdown-item"><a href="/blog/index/2_process.html" class="nav-link"><!---->
  进程管理
</a></li><li class="dropdown-item"><a href="/blog/index/3_task.html" class="nav-link"><!---->
  任务管理
</a></li><li class="dropdown-item"><a href="/blog/index/4_mem.html" class="nav-link"><!---->
  内存管理
</a></li><li class="dropdown-item"><a href="/blog/index/5_ipc.html" class="nav-link"><!---->
  进程通讯
</a></li><li class="dropdown-item"><a href="/blog/index/6_fs.html" class="nav-link"><!---->
  文件系统
</a></li><li class="dropdown-item"><a href="/blog/index/7_hw.html" class="nav-link"><!---->
  软硬接口
</a></li><li class="dropdown-item"><a href="/blog/index/8_asm.html" class="nav-link"><!---->
  内核汇编
</a></li><li class="dropdown-item"><a href="/blog/index/9_run.html" class="nav-link"><!---->
  编译运行
</a></li><li class="dropdown-item"><a href="/blog/index/10_test.html" class="nav-link"><!---->
  调测工具
</a></li><li class="dropdown-item"><a href="/blog/index/0_so.html" class="nav-link"><!---->
  前因后果
</a></li><li class="dropdown-item"><a href="/extsite.html" class="nav-link"><!---->
  前往 &gt;&gt; 外站
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="论坛中心" class="dropdown-title"><span class="title"><!---->
        论坛中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://bbs.weharmonyos.com" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  论坛首页
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://bbs.weharmonyos.com/forum-42-1.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  问题建议
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="手册中心" class="dropdown-title"><span class="title"><!---->
        手册中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://doxygen.weharmonyos.com/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  内核参考手册
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="/compile/assembly.html" class="nav-link"><!---->
  gnu 汇编教程
</a></li><li class="dropdown-item"><a href="/compile/gn/docs/" class="nav-link"><!---->
  gn 参考手册
</a></li><li class="dropdown-item"><a href="/compile/ninja/Readme-CN.html" class="nav-link"><!---->
  ninja 参考手册
</a></li><li class="dropdown-item"><a href="/compile/fhs.html" class="nav-link"><!---->
  fhs 规范
</a></li></ul></div></div><div class="nav-item"><a href="/donate.html" class="nav-link"><!---->
  赞助中心
</a></div></nav> <!----> <!----> <!----> <div class="content__navbar-end"></div></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><!----> <!----> <div class="content__sidebar-top"></div> <nav class="sidebar-nav-links"><div class="nav-item"><a href="/" class="nav-link router-link-active"><!---->
  首页
</a></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="文档中心" class="dropdown-title"><span class="title"><!---->
      文档中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/readme/Readme-CN.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  子系统
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/device-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  南向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/application-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  北向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="博客中心" class="dropdown-title"><span class="title"><!---->
      博客中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/101.html" class="nav-link"><!---->
  总目录
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/1_base.html" class="nav-link"><!---->
  基础知识
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/2_process.html" class="nav-link"><!---->
  进程管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/3_task.html" class="nav-link"><!---->
  任务管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/4_mem.html" class="nav-link"><!---->
  内存管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/5_ipc.html" class="nav-link"><!---->
  进程通讯
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/6_fs.html" class="nav-link"><!---->
  文件系统
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/7_hw.html" class="nav-link"><!---->
  软硬接口
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/8_asm.html" class="nav-link"><!---->
  内核汇编
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/9_run.html" class="nav-link"><!---->
  编译运行
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/10_test.html" class="nav-link"><!---->
  调测工具
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/0_so.html" class="nav-link"><!---->
  前因后果
</a></li><li class="dropdown-item"><!----> <a href="/extsite.html" class="nav-link"><!---->
  前往 &gt;&gt; 外站
</a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="论坛中心" class="dropdown-title"><span class="title"><!---->
      论坛中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://bbs.weharmonyos.com" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  论坛首页
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://bbs.weharmonyos.com/forum-42-1.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  问题建议
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="手册中心" class="dropdown-title"><span class="title"><!---->
      手册中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://doxygen.weharmonyos.com/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  内核参考手册
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="/compile/assembly.html" class="nav-link"><!---->
  gnu 汇编教程
</a></li><li class="dropdown-item"><!----> <a href="/compile/gn/docs/" class="nav-link"><!---->
  gn 参考手册
</a></li><li class="dropdown-item"><!----> <a href="/compile/ninja/Readme-CN.html" class="nav-link"><!---->
  ninja 参考手册
</a></li><li class="dropdown-item"><!----> <a href="/compile/fhs.html" class="nav-link"><!---->
  fhs 规范
</a></li></ul></div></div><div class="nav-item"><a href="/donate.html" class="nav-link"><!---->
  赞助中心
</a></div> <!----></nav> <!----> <div class="content__sidebar-center"></div> <ul class="sidebar-links"><li><a href="/blog/101.html" class="sidebar-link">总目录</a></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">基础知识 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable open"><!----> <span class="title">进程管理 | 10</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/blog/index/2_process.html" class="sidebar-link">本章目录</a></li><li><a href="/blog/11.html" class="sidebar-link">调度故事</a></li><li><a href="/blog/12.html" class="sidebar-link">进程控制块</a></li><li><a href="/blog/13.html" class="sidebar-link">进程空间</a></li><li><a href="/blog/14.html" class="sidebar-link">映射区</a></li><li><a href="/blog/15.html" class="sidebar-link">红黑树</a></li><li><a href="/blog/16.html" class="sidebar-link">进程管理</a></li><li><a href="/blog/17.html" class="sidebar-link">Fork进程</a></li><li><a href="/blog/18.html" class="sidebar-link">进程回收</a></li><li><a href="/blog/19.html" class="sidebar-link">Shell编辑</a></li><li><a href="/blog/20.html" aria-current="page" class="active sidebar-link">Shell解析</a><ul class="sidebar-sub-headers"></ul></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">任务管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">内存管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">通讯机制 | 14</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">文件系统 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">硬件架构 | 9</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">内核汇编 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">编译运行 | 13</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">调测工具 | 4</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">前因后果 | 4</span> <span class="arrow right"></span></p> <!----></section></li></ul> <!----> <div class="content__sidebar-bottom"></div> <!----></aside> <main class="page"><nav class="breadcrumb disable"><!----></nav> <!----> <div class="content__page-top"></div> <div vocab="https://schema.org/" typeof="Article" class="page-title"><h1><!----> <span property="headline"></span></h1> <div class="page-info"><!----> </div> <!----> <hr></div> <div class="anchor-place-holder"><aside id="anchor"><div class="anchor-wrapper"><ul class="anchor-list"><li class="anchor"><a href="/blog/20.html#总体过程" class="anchor-link heading3"><div>总体过程</div></a></li><li class="anchor"><a href="/blog/20.html#结构体" class="anchor-link heading3"><div>结构体</div></a></li><li class="anchor"><a href="/blog/20.html#第一步-shell-注册" class="anchor-link heading3"><div>第一步 | Shell 注册</div></a></li><li class="anchor"><a href="/blog/20.html#第二步-解析-shelltask" class="anchor-link heading3"><div>第二步 解析 | ShellTask</div></a></li><li class="anchor"><a href="/blog/20.html#第三步-执行" class="anchor-link heading3"><div>第三步 | 执行</div></a></li><li class="anchor"><a href="/blog/20.html#百文说内核-抓住主脉络" class="anchor-link heading3"><div>百文说内核 | 抓住主脉络</div></a></li><li class="anchor"><a href="/blog/20.html#百万注源码-处处扣细节" class="anchor-link heading3"><div>百万注源码 | 处处扣细节</div></a></li><li class="anchor"><a href="/blog/20.html#关注不迷路-代码即人生" class="anchor-link heading3"><div>关注不迷路 | 代码即人生</div></a></li></ul></div></aside></div> <!----> <div class="content__content-top"></div> <div class="theme-default-content content__default"><p>本篇关键词：、、、</p> <p><a href="https://weharmony.gitee.io/blog/20.html" target="_blank" rel="noopener noreferrer"><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/index/20.png" alt=""></a></p> <p><a href="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/pdf/%E9%B8%BF%E8%92%99%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90(%E7%99%BE%E7%AF%87%E5%8D%9A%E5%AE%A2%E5%88%86%E6%9E%90.%E6%8C%96%E9%80%8F%E9%B8%BF%E8%92%99%E5%86%85%E6%A0%B8).zip" target="_blank" rel="noopener noreferrer">下载 &gt;&gt; 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf</a></p> <p>进程管理相关篇为:</p> <ul><li><a href="http://weharmonyos.com/blog/11.html" target="_blank" rel="noopener noreferrer">v11.04 鸿蒙内核源码分析(调度故事) | 大郎，该喝药了</a></li> <li><a href="http://weharmonyos.com/blog/12.html" target="_blank" rel="noopener noreferrer">v12.03 鸿蒙内核源码分析(进程控制块) | 可怜天下父母心</a></li> <li><a href="http://weharmonyos.com/blog/13.html" target="_blank" rel="noopener noreferrer">v13.01 鸿蒙内核源码分析(进程空间) | 有爱的地方才叫家 </a></li> <li><a href="http://weharmonyos.com/blog/14.html" target="_blank" rel="noopener noreferrer">v14.01 鸿蒙内核源码分析(线性区) | 人要有空间才能好好相处</a></li> <li><a href="http://weharmonyos.com/blog/15.html" target="_blank" rel="noopener noreferrer">v15.01 鸿蒙内核源码分析(红黑树) | 众里寻他千百度 </a></li> <li><a href="http://weharmonyos.com/blog/16.html" target="_blank" rel="noopener noreferrer">v16.06 鸿蒙内核源码分析(进程管理) | 家家有本难念的经</a></li> <li><a href="http://weharmonyos.com/blog/17.html" target="_blank" rel="noopener noreferrer">v17.05 鸿蒙内核源码分析(Fork进程) | 一次调用 两次返回</a></li> <li><a href="http://weharmonyos.com/blog/18.html" target="_blank" rel="noopener noreferrer">v18.02 鸿蒙内核源码分析(进程回收) | 临终托孤的短命娃</a></li> <li><a href="http://weharmonyos.com/blog/19.html" target="_blank" rel="noopener noreferrer">v19.03 鸿蒙内核源码分析(Shell编辑) | 两个任务 三个阶段</a></li> <li><a href="http://weharmonyos.com/blog/20.html" target="_blank" rel="noopener noreferrer">v20.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口</a></li></ul> <p>系列篇从内核视角用一句话概括<code>shell</code>的底层实现为：<strong>两个任务，三个阶段</strong>。其本质是独立进程，因而划到进程管理模块。每次创建<code>shell</code>进程都会再创建两个任务。</p> <ul><li><strong>客户端任务(ShellEntry)：</strong> 负责接受来自终端(控制台)敲入的一个个字符，字符按<code>VT</code>规范组装成一句句的命令。</li> <li><strong>服务端任务(ShellTask)：</strong> 对命令进行解析并执行，将结果输出到控制台。
而按命令生命周期可分三个阶段。</li> <li><strong>编辑：</strong> 鸿蒙在这个部分实现了一个简单的编辑器功能，处理控制台输入的每个字符，主要包括了对控制字符 例如 <code>&lt;ESC&gt;</code>，<code>\t</code>，<code>\b</code>，<code>\n</code>，<code>\r</code>，四个方向键<code>0x41</code> ~ <code>0x44</code> 的处理。</li> <li><strong>解析：</strong> 对编辑后的字符串进行解析，解析出命令项和参数项，找到对应的命令项执行函数。</li> <li><strong>执行：</strong> 命令可通过静态和动态两种方式注册到内核，解析出具体命令后在注册表中找到对应函数回调。将结果输出到控制台。</li></ul> <p>编辑部分由客户端任务完成，后两个部分由服务端任务完成，命令全局注册由内核完成。</p> <ul><li>本篇主要说 <strong>服务端任务</strong> 和 <strong>解析/执行过程</strong>。</li> <li><strong>客户端任务</strong> 和 <strong>编辑过程</strong> 已在<a href="https://weharmony.gitee.io/blog/71.html" target="_blank" rel="noopener noreferrer">(Shell编辑篇)</a>中说明，请自行翻看。</li></ul> <h3 id="总体过程">总体过程</h3> <ul><li>第一步：  将支持的<code>shell</code>命令注册进全局链表，支持静态和动态两种方式，内容包括命令项，参数信息和回调函数。</li> <li>第二步：  由独立任务解析出用户输入的命令行，拆分出命令项和参数内容</li> <li>第三步：  通过命令项在全局链表中遍历找到已注册的回调函数，并执行。</li></ul> <h3 id="结构体">结构体</h3> <p>鸿蒙对命令的注册用了三个结构体，个人感觉前两个可以合成一个，降低代码阅读难度。</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code>STATIC CmdModInfo g_cmdInfo<span class="token punctuation">;</span><span class="token comment">//shell 命令模块信息，上面挂了所有的命令项(ls，cd ，cp ==)</span>

<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span><span class="token comment">//命令项</span>
    CmdType cmdType<span class="token punctuation">;</span>	<span class="token comment">//命令类型</span>
		<span class="token comment">//CMD_TYPE_EX：不支持标准命令参数输入，会把用户填写的命令关键字屏蔽掉，例如：输入ls /ramfs，传入给注册函数的参数只有/ramfs，而ls命令关键字并不会被传入。</span>
		<span class="token comment">//CMD_TYPE_STD：支持的标准命令参数输入，所有输入的字符都会通过命令解析后被传入。</span>
    <span class="token keyword">const</span> CHAR <span class="token operator">*</span>cmdKey<span class="token punctuation">;</span>	<span class="token comment">//命令关键字，例如:ls 函数在Shell中访问的名称。</span>
    UINT32 paraNum<span class="token punctuation">;</span>		<span class="token comment">//调用的执行函数的入参最大个数，暂不支持。</span>
    CmdCallBackFunc cmdHook<span class="token punctuation">;</span><span class="token comment">//命令执行函数地址，即命令实际执行函数。</span>
<span class="token punctuation">}</span> CmdItem<span class="token punctuation">;</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span>	<span class="token comment">//命令节点</span>
    LOS_DL_LIST list<span class="token punctuation">;</span>	<span class="token comment">//双向链表</span>
    CmdItem <span class="token operator">*</span>cmd<span class="token punctuation">;</span>	<span class="token comment">//命令项</span>
<span class="token punctuation">}</span> CmdItemNode<span class="token punctuation">;</span>

<span class="token comment">/* global info for shell module */</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span><span class="token comment">//shell 模块的全局信息</span>
    CmdItemNode cmdList<span class="token punctuation">;</span>	<span class="token comment">//命令项节点</span>
    UINT32 listNum<span class="token punctuation">;</span><span class="token comment">//节点数量</span>
    UINT32 initMagicFlag<span class="token punctuation">;</span><span class="token comment">//初始魔法标签 0xABABABAB</span>
    LosMux muxLock<span class="token punctuation">;</span>	<span class="token comment">//操作链表互斥锁</span>
    CmdVerifyTransID transIdHook<span class="token punctuation">;</span><span class="token comment">//暂不知何意</span>
<span class="token punctuation">}</span> CmdModInfo<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br></div></div><p><strong>解读</strong></p> <ul><li><code>CmdItem</code>为注册的内容载体结构体，<code>cmdHook</code>为回调函数，是命令的真正执行体。</li> <li>通过双向链表<code>CmdItemNode.list</code>将所有命令穿起来</li> <li><code>CmdModInfo</code>记录命令数量和操作的互斥锁，<code>shell</code>的魔法数字为 <code>0xABABABAB</code></li></ul> <h3 id="第一步-shell-注册">第一步 | Shell 注册</h3> <ul><li><p><strong>静态宏方式注册，链接时处理</strong>
静态注册命令方式一般用在系统常用命令注册，鸿蒙已支持以下命令。</p> <div class="language- line-numbers-mode"><pre class="language-text"><code>    arp           cat           cd            chgrp         chmod         chown         cp            cpup          
    date          dhclient      dmesg         dns           format        free          help          hwi           
    ifconfig      ipdebug       kill          log           ls            lsfd          memcheck      mkdir         
    mount         netstat       oom           partinfo      partition     ping          ping6         pwd           
    reset         rm            rmdir         sem           statfs        su            swtmr         sync          
    systeminfo    task          telnet        test          tftp          touch         umount        uname         
    watch         writeproc  
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>例如注册 <code>ls</code>命令</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token function">SHELLCMD_ENTRY</span><span class="token punctuation">(</span>ls_shellcmd，  CMD_TYPE_EX， <span class="token string">&quot;ls&quot;</span>， XARGS，  <span class="token punctuation">(</span>CMD_CBK_FUNC<span class="token punctuation">)</span>osShellCmdLs<span class="token punctuation">)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>需在链接选项中添加链接该新增命令项参数，具体在<code>liteos_tables_ldflags.mk</code>文件的<code>LITEOS_TABLES_LDFLAGS</code>项下添加<code>-uls_shellcmd</code>。至于<code>SHELLCMD_ENTRY</code>是如何实现的在链接阶段的注册，请自行翻看<a href="https://weharmony.gitee.io" target="_blank" rel="noopener noreferrer">(内联汇编篇)</a>，有详细说明实现细节。</p></li> <li><p><strong>动态命令方式，运行时处理</strong>
动态注册命令方式一般用在用户命令注册，具体实现代码如下:</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token function">osCmdReg</span><span class="token punctuation">(</span>CMD_TYPE_EX， <span class="token string">&quot;ls&quot;</span>， XARGS，  <span class="token punctuation">(</span>CMD_CBK_FUNC<span class="token punctuation">)</span>osShellCmdLs<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment">// ....</span>
    <span class="token comment">//5.正式创建命令，挂入链表</span>
    <span class="token keyword">return</span> <span class="token function">OsCmdItemCreate</span><span class="token punctuation">(</span>cmdType， cmdKey， paraNum， cmdProc<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//不存在就注册命令</span>
<span class="token punctuation">}</span>
<span class="token comment">//创建一个命令项，例如 chmod</span>
STATIC UINT32 <span class="token function">OsCmdItemCreate</span><span class="token punctuation">(</span>CmdType cmdType， <span class="token keyword">const</span> CHAR <span class="token operator">*</span>cmdKey， UINT32 paraNum， CmdCallBackFunc cmdProc<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    CmdItem <span class="token operator">*</span>cmdItem <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    CmdItemNode <span class="token operator">*</span>cmdItemNode <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    <span class="token comment">//1.构造命令节点过程</span>
    cmdItem <span class="token operator">=</span> <span class="token punctuation">(</span>CmdItem <span class="token operator">*</span><span class="token punctuation">)</span><span class="token function">LOS_MemAlloc</span><span class="token punctuation">(</span>m_aucSysMem0， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>CmdItem<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>cmdItem <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">memset_s</span><span class="token punctuation">(</span>cmdItem， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>CmdItem<span class="token punctuation">)</span>， <span class="token char">'\0'</span>， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>CmdItem<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    cmdItemNode <span class="token operator">=</span> <span class="token punctuation">(</span>CmdItemNode <span class="token operator">*</span><span class="token punctuation">)</span><span class="token function">LOS_MemAlloc</span><span class="token punctuation">(</span>m_aucSysMem0， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>CmdItemNode<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>cmdItemNode <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_MemFree</span><span class="token punctuation">(</span>m_aucSysMem0， cmdItem<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">memset_s</span><span class="token punctuation">(</span>cmdItemNode， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>CmdItemNode<span class="token punctuation">)</span>， <span class="token char">'\0'</span>， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>CmdItemNode<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    cmdItemNode<span class="token operator">-&gt;</span>cmd <span class="token operator">=</span> cmdItem<span class="token punctuation">;</span>			<span class="token comment">//命令项 </span>
    cmdItemNode<span class="token operator">-&gt;</span>cmd<span class="token operator">-&gt;</span>cmdHook <span class="token operator">=</span> cmdProc<span class="token punctuation">;</span><span class="token comment">//回调函数 osShellCmdLs</span>
    cmdItemNode<span class="token operator">-&gt;</span>cmd<span class="token operator">-&gt;</span>paraNum <span class="token operator">=</span> paraNum<span class="token punctuation">;</span><span class="token comment">//`777`，'/home'</span>
    cmdItemNode<span class="token operator">-&gt;</span>cmd<span class="token operator">-&gt;</span>cmdType <span class="token operator">=</span> cmdType<span class="token punctuation">;</span><span class="token comment">//关键字类型</span>
    cmdItemNode<span class="token operator">-&gt;</span>cmd<span class="token operator">-&gt;</span>cmdKey <span class="token operator">=</span> cmdKey<span class="token punctuation">;</span>	<span class="token comment">//`chmod`</span>
    <span class="token comment">//2.完成构造后挂入全局链表</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_MuxLock</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>g_cmdInfo<span class="token punctuation">.</span>muxLock， LOS_WAIT_FOREVER<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">OsCmdAscendingInsert</span><span class="token punctuation">(</span>cmdItemNode<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//按升序方式插入</span>
    g_cmdInfo<span class="token punctuation">.</span>listNum<span class="token operator">++</span><span class="token punctuation">;</span><span class="token comment">//命令总数增加</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_MuxUnlock</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>g_cmdInfo<span class="token punctuation">.</span>muxLock<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">return</span> LOS_OK<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br></div></div></li></ul> <h3 id="第二步-解析-shelltask">第二步 解析 | ShellTask</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token comment">//shell 服务端任务初始化，这个任务负责解析和执行命令</span>
LITE_OS_SEC_TEXT_MINOR UINT32 <span class="token function">ShellTaskInit</span><span class="token punctuation">(</span>ShellCB <span class="token operator">*</span>shellCB<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    CHAR <span class="token operator">*</span>name <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    TSK_INIT_PARAM_S initParam <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
	<span class="token comment">//输入Shell命令的两种方式</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>shellCB<span class="token operator">-&gt;</span>consoleID <span class="token operator">==</span> CONSOLE_SERIAL<span class="token punctuation">)</span> <span class="token punctuation">{</span>	<span class="token comment">//通过串口工具</span>
        name <span class="token operator">=</span> SERIAL_SHELL_TASK_NAME<span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>shellCB<span class="token operator">-&gt;</span>consoleID <span class="token operator">==</span> CONSOLE_TELNET<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//通过远程工具</span>
        name <span class="token operator">=</span> TELNET_SHELL_TASK_NAME<span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> LOS_NOK<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    initParam<span class="token punctuation">.</span>pfnTaskEntry <span class="token operator">=</span> <span class="token punctuation">(</span>TSK_ENTRY_FUNC<span class="token punctuation">)</span>ShellTask<span class="token punctuation">;</span><span class="token comment">//任务入口函数，主要是解析shell命令</span>
    initParam<span class="token punctuation">.</span>usTaskPrio   <span class="token operator">=</span> <span class="token number">9</span><span class="token punctuation">;</span> <span class="token comment">/* 9:shell task priority */</span>
    initParam<span class="token punctuation">.</span>auwArgs<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>   <span class="token operator">=</span> <span class="token punctuation">(</span>UINTPTR<span class="token punctuation">)</span>shellCB<span class="token punctuation">;</span>
    initParam<span class="token punctuation">.</span>uwStackSize  <span class="token operator">=</span> <span class="token number">0x3000</span><span class="token punctuation">;</span>
    initParam<span class="token punctuation">.</span>pcName       <span class="token operator">=</span> name<span class="token punctuation">;</span>
    initParam<span class="token punctuation">.</span>uwResved     <span class="token operator">=</span> LOS_TASK_STATUS_DETACHED<span class="token punctuation">;</span>

    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_EventInit</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>shellCB<span class="token operator">-&gt;</span>shellEvent<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//初始化事件，以事件方式通知任务解析命令</span>

    <span class="token keyword">return</span> <span class="token function">LOS_TaskCreate</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>shellCB<span class="token operator">-&gt;</span>shellTaskHandle， <span class="token operator">&amp;</span>initParam<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建任务</span>
<span class="token punctuation">}</span>
LITE_OS_SEC_TEXT_MINOR UINT32 <span class="token function">ShellTask</span><span class="token punctuation">(</span>UINTPTR param1，
                                        UINTPTR param2，
                                        UINTPTR param3，
                                        UINTPTR param4<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    UINT32 ret<span class="token punctuation">;</span>
    ShellCB <span class="token operator">*</span>shellCB <span class="token operator">=</span> <span class="token punctuation">(</span>ShellCB <span class="token operator">*</span><span class="token punctuation">)</span>param1<span class="token punctuation">;</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span>param2<span class="token punctuation">;</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span>param3<span class="token punctuation">;</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span>param4<span class="token punctuation">;</span>

    <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token function">PRINTK</span><span class="token punctuation">(</span><span class="token string">&quot;\nOHOS # &quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//读取shell 输入事件 例如: cat weharmony.net 命令</span>
        ret <span class="token operator">=</span> <span class="token function">LOS_EventRead</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>shellCB<span class="token operator">-&gt;</span>shellEvent，
                            <span class="token number">0xFFF</span>， LOS_WAITMODE_OR <span class="token operator">|</span> LOS_WAITMODE_CLR， LOS_WAIT_FOREVER<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">==</span> SHELL_CMD_PARSE_EVENT<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//获得解析命令事件</span>
            <span class="token function">ShellCmdProcess</span><span class="token punctuation">(</span>shellCB<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//处理命令 </span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">==</span> CONSOLE_SHELL_KEY_EVENT<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//退出shell事件</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token function">OsShellKeyDeInit</span><span class="token punctuation">(</span><span class="token punctuation">(</span>CmdKeyLink <span class="token operator">*</span><span class="token punctuation">)</span>shellCB<span class="token operator">-&gt;</span>cmdKeyLink<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//</span>
    <span class="token function">OsShellKeyDeInit</span><span class="token punctuation">(</span><span class="token punctuation">(</span>CmdKeyLink <span class="token operator">*</span><span class="token punctuation">)</span>shellCB<span class="token operator">-&gt;</span>cmdHistoryKeyLink<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_EventDestroy</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>shellCB<span class="token operator">-&gt;</span>shellEvent<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//注销事件</span>
    <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_MemFree</span><span class="token punctuation">(</span><span class="token punctuation">(</span>VOID <span class="token operator">*</span><span class="token punctuation">)</span>m_aucSysMem0， shellCB<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//释放shell控制块</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br></div></div><p><strong>解读</strong></p> <ul><li><p>任务优先级和 客户端任务 一样同为 <code>9</code></p></li> <li><p>指定内核栈大小为<code>0x3000 = 12K</code> ，因任务负责命令的解析和执行，所以需要更大的内核空间。</p></li> <li><p>任务的入口函数<code>ShellTask</code>，一个死循环在以<code>LOS_WAIT_FOREVER</code>方式死等事件发生。</p> <ul><li><code>SHELL_CMD_PARSE_EVENT</code> 通知开始解析事件，该事件由 客户端任务<code>ShellEntry</code>检测到回车键时发出。</li></ul> <div class="language-c line-numbers-mode"><pre class="language-c"><code>  STATIC VOID <span class="token function">ShellNotify</span><span class="token punctuation">(</span>ShellCB <span class="token operator">*</span>shellCB<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>
      <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_EventWrite</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>shellCB<span class="token operator">-&gt;</span>shellEvent， SHELL_CMD_PARSE_EVENT<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><ul><li><code>CONSOLE_SHELL_KEY_EVENT</code> 收到 <code>exit</code>命令时将发出该事件，退出<code>shell</code>回收资源
鸿蒙内核是如何管理和使用事件的请自行翻看<a href="https://weharmony.gitee.io/blog/30_%E4%BA%8B%E4%BB%B6%E6%8E%A7%E5%88%B6%E7%AF%87.html" target="_blank" rel="noopener noreferrer">(事件控制篇)</a></li></ul></li> <li><p>层层跟进<code>ShellCmdProcess</code>，解析出命令项和参数内容，最终跑到<code>OsCmdExec</code>中遍历 已注册的命令表，找出命令对应的函数完成回调。</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code>LITE_OS_SEC_TEXT_MINOR UINT32 <span class="token function">OsCmdExec</span><span class="token punctuation">(</span>CmdParsed <span class="token operator">*</span>cmdParsed， CHAR <span class="token operator">*</span>cmdStr<span class="token punctuation">)</span>
  <span class="token punctuation">{</span>
      UINT32 ret<span class="token punctuation">;</span>
      CmdCallBackFunc cmdHook <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
      CmdItemNode <span class="token operator">*</span>curCmdItem <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
      UINT32 i<span class="token punctuation">;</span>
      <span class="token keyword">const</span> CHAR <span class="token operator">*</span>cmdKey <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>

      <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>cmdParsed <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>cmdStr <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token function">strlen</span><span class="token punctuation">(</span>cmdStr<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token punctuation">(</span>UINT32<span class="token punctuation">)</span>OS_ERROR<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>

      ret <span class="token operator">=</span> <span class="token function">OsCmdParse</span><span class="token punctuation">(</span>cmdStr， cmdParsed<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//解析出命令关键字，参数</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">!=</span> LOS_OK<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">goto</span> OUT<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      <span class="token comment">//遍历命令注册全局链表</span>
      <span class="token function">LOS_DL_LIST_FOR_EACH_ENTRY</span><span class="token punctuation">(</span>curCmdItem， <span class="token operator">&amp;</span><span class="token punctuation">(</span>g_cmdInfo<span class="token punctuation">.</span>cmdList<span class="token punctuation">.</span>list<span class="token punctuation">)</span>， CmdItemNode， list<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          cmdKey <span class="token operator">=</span> curCmdItem<span class="token operator">-&gt;</span>cmd<span class="token operator">-&gt;</span>cmdKey<span class="token punctuation">;</span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>cmdParsed<span class="token operator">-&gt;</span>cmdType <span class="token operator">==</span> curCmdItem<span class="token operator">-&gt;</span>cmd<span class="token operator">-&gt;</span>cmdType<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span>
              <span class="token punctuation">(</span><span class="token function">strlen</span><span class="token punctuation">(</span>cmdKey<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token function">strlen</span><span class="token punctuation">(</span>cmdParsed<span class="token operator">-&gt;</span>cmdKeyword<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span>
              <span class="token punctuation">(</span><span class="token function">strncmp</span><span class="token punctuation">(</span>cmdKey， <span class="token punctuation">(</span>CHAR <span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">(</span>cmdParsed<span class="token operator">-&gt;</span>cmdKeyword<span class="token punctuation">)</span>， <span class="token function">strlen</span><span class="token punctuation">(</span>cmdKey<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//找到命令的回调函数 例如: ls &lt;-&gt; osShellCmdLs</span>
              cmdHook <span class="token operator">=</span> curCmdItem<span class="token operator">-&gt;</span>cmd<span class="token operator">-&gt;</span>cmdHook<span class="token punctuation">;</span>
              <span class="token keyword">break</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span>
      <span class="token punctuation">}</span>

      ret <span class="token operator">=</span> OS_ERROR<span class="token punctuation">;</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>cmdHook <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//执行命令，即回调函数</span>
          ret <span class="token operator">=</span> <span class="token punctuation">(</span>cmdHook<span class="token punctuation">)</span><span class="token punctuation">(</span>cmdParsed<span class="token operator">-&gt;</span>paramCnt， <span class="token punctuation">(</span><span class="token keyword">const</span> CHAR <span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation">)</span>cmdParsed<span class="token operator">-&gt;</span>paramArray<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>

  OUT<span class="token operator">:</span>
      <span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> cmdParsed<span class="token operator">-&gt;</span>paramCnt<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//无效的命令要释放掉保存参数的内存</span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span>cmdParsed<span class="token operator">-&gt;</span>paramArray<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
              <span class="token punctuation">(</span>VOID<span class="token punctuation">)</span><span class="token function">LOS_MemFree</span><span class="token punctuation">(</span>m_aucSysMem0， cmdParsed<span class="token operator">-&gt;</span>paramArray<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              cmdParsed<span class="token operator">-&gt;</span>paramArray<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span>
      <span class="token punctuation">}</span>

      <span class="token keyword">return</span> <span class="token punctuation">(</span>UINT32<span class="token punctuation">)</span>ret<span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br></div></div></li></ul> <h3 id="第三步-执行">第三步 | 执行</h3> <p>想知道有哪些系统<code>shell</code>命令，可以搜索关键词<code>SHELLCMD_ENTRY</code>拿到所有通过静态方式注册的命令。
<img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/72/shell.png" alt="">
其中有网络的，进程的，任务的，内存的 等等，此处列出几个常用的<code>shell</code>命令的实现。</p> <h4 id="ls-命令"><strong>ls 命令</strong></h4> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token function">SHELLCMD_ENTRY</span><span class="token punctuation">(</span>ls_shellcmd， CMD_TYPE_EX， <span class="token string">&quot;ls&quot;</span>， XARGS， <span class="token punctuation">(</span>CmdCallBackFunc<span class="token punctuation">)</span>osShellCmdLs<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/*******************************************************
命令功能
ls命令用来显示当前目录的内容。

命令格式
ls [path]

path为空时，显示当前目录的内容。
path为无效文件名时，显示失败，提示：
ls error: No such directory。
path为有效目录路径时，会显示对应目录下的内容。

使用指南
ls命令显示当前目录的内容。
ls可以显示文件的大小。
proc下ls无法统计文件大小，显示为0。

*******************************************************/</span>
<span class="token keyword">int</span> <span class="token function">osShellCmdLs</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc， <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token operator">*</span>argv<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
  <span class="token keyword">char</span> <span class="token operator">*</span>fullpath <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
  <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>filename <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
  <span class="token keyword">int</span> ret<span class="token punctuation">;</span>
  <span class="token keyword">char</span> <span class="token operator">*</span>shell_working_directory <span class="token operator">=</span> <span class="token function">OsShellGetWorkingDirtectory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取当前工作目录</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>shell_working_directory <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

  <span class="token function">ERROR_OUT_IF</span><span class="token punctuation">(</span>argc <span class="token operator">&gt;</span> <span class="token number">1</span>， <span class="token function">PRINTK</span><span class="token punctuation">(</span><span class="token string">&quot;ls or ls [DIRECTORY]\n&quot;</span><span class="token punctuation">)</span>， <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">if</span> <span class="token punctuation">(</span>argc <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token comment">//木有参数时 -&gt; #ls </span>
    <span class="token punctuation">{</span>
      <span class="token function">ls</span><span class="token punctuation">(</span>shell_working_directory<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//执行ls 当前工作目录</span>
      <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

  filename <span class="token operator">=</span> argv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//有参数时 -&gt; #ls ../harmony  or #ls /no such file or directory</span>
  ret <span class="token operator">=</span> <span class="token function">vfs_normalize_path</span><span class="token punctuation">(</span>shell_working_directory， filename， <span class="token operator">&amp;</span>fullpath<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取全路径，注意这里带出来fullpath，而fullpath已经在内核空间</span>
  <span class="token function">ERROR_OUT_IF</span><span class="token punctuation">(</span>ret <span class="token operator">&lt;</span> <span class="token number">0</span>， <span class="token function">set_err</span><span class="token punctuation">(</span><span class="token operator">-</span>ret， <span class="token string">&quot;ls error&quot;</span><span class="token punctuation">)</span>， <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token function">ls</span><span class="token punctuation">(</span>fullpath<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//执行 ls 全路径</span>
  <span class="token function">free</span><span class="token punctuation">(</span>fullpath<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//释放全路径，为啥要释放，因为fullpath已经由内核空间分配</span>

  <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br></div></div><h4 id="task-命令"><strong>task 命令</strong></h4> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token function">SHELLCMD_ENTRY</span><span class="token punctuation">(</span>task_shellcmd， CMD_TYPE_EX， <span class="token string">&quot;task&quot;</span>， <span class="token number">1</span>， <span class="token punctuation">(</span>CmdCallBackFunc<span class="token punctuation">)</span>OsShellCmdDumpTask<span class="token punctuation">)</span><span class="token punctuation">;</span>

LITE_OS_SEC_TEXT_MINOR UINT32 <span class="token function">OsShellCmdDumpTask</span><span class="token punctuation">(</span>INT32 argc， <span class="token keyword">const</span> CHAR <span class="token operator">*</span><span class="token operator">*</span>argv<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    UINT32 flag <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifdef</span> <span class="token expression">LOSCFG_KERNEL_VM</span></span>
    flag <span class="token operator">|=</span> OS_PROCESS_MEM_INFO<span class="token punctuation">;</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>argc <span class="token operator">&gt;=</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">/* 2: The task shell name restricts the parameters */</span>
        <span class="token keyword">goto</span> TASK_HELP<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>argc <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">strcmp</span><span class="token punctuation">(</span><span class="token string">&quot;-a&quot;</span>， argv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            flag <span class="token operator">|=</span> OS_PROCESS_INFO_ALL<span class="token punctuation">;</span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">strcmp</span><span class="token punctuation">(</span><span class="token string">&quot;-i&quot;</span>， argv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">OsShellShowTickRespo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                <span class="token keyword">return</span> LOS_OK<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
            <span class="token keyword">goto</span> TASK_HELP<span class="token punctuation">;</span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">strcmp</span><span class="token punctuation">(</span><span class="token string">&quot;-t&quot;</span>， argv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">OsShellShowSchedParam</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                <span class="token keyword">return</span> LOS_OK<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
            <span class="token keyword">goto</span> TASK_HELP<span class="token punctuation">;</span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            <span class="token keyword">goto</span> TASK_HELP<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">return</span> <span class="token function">OsShellCmdTskInfoGet</span><span class="token punctuation">(</span>OS_ALL_TASK_MASK， <span class="token constant">NULL</span>， flag<span class="token punctuation">)</span><span class="token punctuation">;</span>

TASK_HELP<span class="token operator">:</span>
    <span class="token function">PRINTK</span><span class="token punctuation">(</span><span class="token string">&quot;Unknown option: %s\n&quot;</span>， argv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">PRINTK</span><span class="token punctuation">(</span><span class="token string">&quot;usage: task or task -a\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> LOS_NOK<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br></div></div><h4 id="cat-命令"><strong>cat 命令</strong></h4> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token function">SHELLCMD_ENTRY</span><span class="token punctuation">(</span>cat_shellcmd， CMD_TYPE_EX， <span class="token string">&quot;cat&quot;</span>， XARGS， <span class="token punctuation">(</span>CmdCallBackFunc<span class="token punctuation">)</span>osShellCmdCat<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/*****************************************************************
cat用于显示文本文件的内容.cat [pathname]
cat weharmony.txt
*****************************************************************/</span>
<span class="token keyword">int</span> <span class="token function">osShellCmdCat</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc， <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span><span class="token operator">*</span>argv<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
  <span class="token keyword">char</span> <span class="token operator">*</span>fullpath <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
  <span class="token keyword">int</span> ret<span class="token punctuation">;</span>
  <span class="token keyword">unsigned</span> <span class="token keyword">int</span> ca_task<span class="token punctuation">;</span>
  <span class="token keyword">struct</span> <span class="token class-name">Vnode</span> <span class="token operator">*</span>vnode <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
  TSK_INIT_PARAM_S init_param<span class="token punctuation">;</span>
  <span class="token keyword">char</span> <span class="token operator">*</span>shell_working_directory <span class="token operator">=</span> <span class="token function">OsShellGetWorkingDirtectory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//显示当前目录 pwd</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>shell_working_directory <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

  <span class="token function">ERROR_OUT_IF</span><span class="token punctuation">(</span>argc <span class="token operator">!=</span> <span class="token number">1</span>， <span class="token function">PRINTK</span><span class="token punctuation">(</span><span class="token string">&quot;cat [FILE]\n&quot;</span><span class="token punctuation">)</span>， <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  ret <span class="token operator">=</span> <span class="token function">vfs_normalize_path</span><span class="token punctuation">(</span>shell_working_directory， argv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>， <span class="token operator">&amp;</span>fullpath<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//由相对路径获取绝对路径</span>
  <span class="token function">ERROR_OUT_IF</span><span class="token punctuation">(</span>ret <span class="token operator">&lt;</span> <span class="token number">0</span>， <span class="token function">set_err</span><span class="token punctuation">(</span><span class="token operator">-</span>ret， <span class="token string">&quot;cat error&quot;</span><span class="token punctuation">)</span>， <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token function">VnodeHold</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  ret <span class="token operator">=</span> <span class="token function">VnodeLookup</span><span class="token punctuation">(</span>fullpath， <span class="token operator">&amp;</span>vnode， O_RDONLY<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">!=</span> LOS_OK<span class="token punctuation">)</span>
      <span class="token punctuation">{</span>
        <span class="token function">set_errno</span><span class="token punctuation">(</span><span class="token operator">-</span>ret<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">perror</span><span class="token punctuation">(</span><span class="token string">&quot;cat error&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">VnodeDrop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">free</span><span class="token punctuation">(</span>fullpath<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>vnode<span class="token operator">-&gt;</span>type <span class="token operator">!=</span> VNODE_TYPE_REG<span class="token punctuation">)</span>
      <span class="token punctuation">{</span>
        <span class="token function">set_errno</span><span class="token punctuation">(</span>EINVAL<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">perror</span><span class="token punctuation">(</span><span class="token string">&quot;cat error&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">VnodeDrop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">free</span><span class="token punctuation">(</span>fullpath<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
  <span class="token function">VnodeDrop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token function">memset_s</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>init_param， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>init_param<span class="token punctuation">)</span>， <span class="token number">0</span>， <span class="token keyword">sizeof</span><span class="token punctuation">(</span>TSK_INIT_PARAM_S<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  init_param<span class="token punctuation">.</span>pfnTaskEntry <span class="token operator">=</span> <span class="token punctuation">(</span>TSK_ENTRY_FUNC<span class="token punctuation">)</span>osShellCmdDoCatShow<span class="token punctuation">;</span>
  init_param<span class="token punctuation">.</span>usTaskPrio   <span class="token operator">=</span> CAT_TASK_PRIORITY<span class="token punctuation">;</span>	<span class="token comment">//优先级10</span>
  init_param<span class="token punctuation">.</span>auwArgs<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>   <span class="token operator">=</span> <span class="token punctuation">(</span>UINTPTR<span class="token punctuation">)</span>fullpath<span class="token punctuation">;</span>	<span class="token comment">//入口参数</span>
  init_param<span class="token punctuation">.</span>uwStackSize  <span class="token operator">=</span> CAT_TASK_STACK_SIZE<span class="token punctuation">;</span><span class="token comment">//内核栈大小</span>
  init_param<span class="token punctuation">.</span>pcName       <span class="token operator">=</span> <span class="token string">&quot;shellcmd_cat&quot;</span><span class="token punctuation">;</span>	<span class="token comment">//任务名称</span>
  init_param<span class="token punctuation">.</span>uwResved     <span class="token operator">=</span> LOS_TASK_STATUS_DETACHED <span class="token operator">|</span> OS_TASK_FLAG_SPECIFIES_PROCESS<span class="token punctuation">;</span>
  init_param<span class="token punctuation">.</span>processID    <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment">/* 2: kProcess */</span> <span class="token comment">//内核任务</span>

  ret <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token function">LOS_TaskCreate</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>ca_task， <span class="token operator">&amp;</span>init_param<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建任务显示cat内容</span>

  <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">!=</span> LOS_OK<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
      <span class="token function">free</span><span class="token punctuation">(</span>fullpath<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

  <span class="token keyword">return</span> ret<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br></div></div><p>你能看明白这些命令的底层实现吗？ 如果看明白了，可能会不由得发出 <strong>原来如此</strong> 的感叹!</p> <h3 id="百文说内核-抓住主脉络">百文说内核 | 抓住主脉络</h3> <ul><li>百文相当于摸出内核的肌肉和器官系统，让人开始丰满有立体感，因是直接从注释源码起步，在加注释过程中，每每有心得处就整理,慢慢形成了以下文章。内容立足源码，常以生活场景打比方尽可能多的将内核知识点置入某种场景，具有画面感，容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念，那没什么意思。更希望让内核变得栩栩如生，倍感亲切。</li> <li>与代码需不断<code>debug</code>一样，文章内容会存在不少错漏之处，请多包涵，但会反复修正，持续更新，<code>v**.xx</code> 代表文章序号和修改的次数，精雕细琢，言简意赅，力求打造精品内容。</li> <li>百文在 &lt; 鸿蒙研究站 | 开源中国 | 博客园 | 51cto | csdn | 知乎 | 掘金 &gt; 站点发布，百篇博客系列目录如下。</li> <li><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/cate.png" alt=""></li></ul> <p>按功能模块:</p> <table><thead><tr><th style="text-align:center;">基础知识</th> <th style="text-align:center;">进程管理</th> <th style="text-align:center;">任务管理</th> <th style="text-align:center;">内存管理</th></tr></thead> <tbody><tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/01.html" target="_blank" rel="noopener noreferrer">双向链表</a><br><a href="http://weharmonyos.com/blog/02.html" target="_blank" rel="noopener noreferrer">内核概念</a><br><a href="http://weharmonyos.com/blog/03.html" target="_blank" rel="noopener noreferrer">源码结构</a><br><a href="http://weharmonyos.com/blog/04.html" target="_blank" rel="noopener noreferrer">地址空间</a><br><a href="http://weharmonyos.com/blog/05.html" target="_blank" rel="noopener noreferrer">计时单位</a><br><a href="http://weharmonyos.com/blog/06.html" target="_blank" rel="noopener noreferrer">优雅的宏</a><br><a href="http://weharmonyos.com/blog/07.html" target="_blank" rel="noopener noreferrer">钩子框架</a><br><a href="http://weharmonyos.com/blog/08.html" target="_blank" rel="noopener noreferrer">位图管理</a><br><a href="http://weharmonyos.com/blog/09.html" target="_blank" rel="noopener noreferrer">POSIX</a><br><a href="http://weharmonyos.com/blog/10.html" target="_blank" rel="noopener noreferrer">main函数</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/11.html" target="_blank" rel="noopener noreferrer">调度故事</a><br><a href="http://weharmonyos.com/blog/12.html" target="_blank" rel="noopener noreferrer">进程控制块</a><br><a href="http://weharmonyos.com/blog/13.html" target="_blank" rel="noopener noreferrer">进程空间</a><br><a href="http://weharmonyos.com/blog/14.html" target="_blank" rel="noopener noreferrer">线性区</a><br><a href="http://weharmonyos.com/blog/15.html" target="_blank" rel="noopener noreferrer">红黑树</a><br><a href="http://weharmonyos.com/blog/16.html" target="_blank" rel="noopener noreferrer">进程管理</a><br><a href="http://weharmonyos.com/blog/17.html" target="_blank" rel="noopener noreferrer">Fork进程</a><br><a href="http://weharmonyos.com/blog/18.html" target="_blank" rel="noopener noreferrer">进程回收</a><br><a href="http://weharmonyos.com/blog/19.html" target="_blank" rel="noopener noreferrer">Shell编辑</a><br><a href="http://weharmonyos.com/blog/20.html" target="_blank" rel="noopener noreferrer">Shell解析</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/21.html" target="_blank" rel="noopener noreferrer">任务控制块</a><br><a href="http://weharmonyos.com/blog/22.html" target="_blank" rel="noopener noreferrer">并发并行</a><br><a href="http://weharmonyos.com/blog/23.html" target="_blank" rel="noopener noreferrer">就绪队列</a><br><a href="http://weharmonyos.com/blog/24.html" target="_blank" rel="noopener noreferrer">调度机制</a><br><a href="http://weharmonyos.com/blog/25.html" target="_blank" rel="noopener noreferrer">任务管理</a><br><a href="http://weharmonyos.com/blog/26.html" target="_blank" rel="noopener noreferrer">用栈方式</a><br><a href="http://weharmonyos.com/blog/27.html" target="_blank" rel="noopener noreferrer">软件定时器</a><br><a href="http://weharmonyos.com/blog/28.html" target="_blank" rel="noopener noreferrer">控制台</a><br><a href="http://weharmonyos.com/blog/29.html" target="_blank" rel="noopener noreferrer">远程登录</a><br><a href="http://weharmonyos.com/blog/30.html" target="_blank" rel="noopener noreferrer">协议栈</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/31.html" target="_blank" rel="noopener noreferrer">内存规则</a><br><a href="http://weharmonyos.com/blog/32.html" target="_blank" rel="noopener noreferrer">物理内存</a><br><a href="http://weharmonyos.com/blog/33.html" target="_blank" rel="noopener noreferrer">内存概念</a><br><a href="http://weharmonyos.com/blog/34.html" target="_blank" rel="noopener noreferrer">虚实映射</a><br><a href="http://weharmonyos.com/blog/35.html" target="_blank" rel="noopener noreferrer">页表管理</a><br><a href="http://weharmonyos.com/blog/36.html" target="_blank" rel="noopener noreferrer">静态分配</a><br><a href="http://weharmonyos.com/blog/37.html" target="_blank" rel="noopener noreferrer">TLFS算法</a><br><a href="http://weharmonyos.com/blog/38.html" target="_blank" rel="noopener noreferrer">内存池管理</a><br><a href="http://weharmonyos.com/blog/39.html" target="_blank" rel="noopener noreferrer">原子操作</a><br><a href="http://weharmonyos.com/blog/40.html" target="_blank" rel="noopener noreferrer">圆整对齐</a><br></td></tr> <tr><td style="text-align:center;">通讯机制</td> <td style="text-align:center;">文件系统</td> <td style="text-align:center;">硬件架构</td> <td style="text-align:center;">内核汇编</td></tr> <tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/41.html" target="_blank" rel="noopener noreferrer">通讯总览</a><br><a href="http://weharmonyos.com/blog/42.html" target="_blank" rel="noopener noreferrer">自旋锁</a><br><a href="http://weharmonyos.com/blog/43.html" target="_blank" rel="noopener noreferrer">互斥锁</a><br><a href="http://weharmonyos.com/blog/44.html" target="_blank" rel="noopener noreferrer">快锁使用</a><br><a href="http://weharmonyos.com/blog/45.html" target="_blank" rel="noopener noreferrer">快锁实现</a><br><a href="http://weharmonyos.com/blog/46.html" target="_blank" rel="noopener noreferrer">读写锁</a><br><a href="http://weharmonyos.com/blog/47.html" target="_blank" rel="noopener noreferrer">信号量</a><br><a href="http://weharmonyos.com/blog/48.html" target="_blank" rel="noopener noreferrer">事件机制</a><br><a href="http://weharmonyos.com/blog/49.html" target="_blank" rel="noopener noreferrer">信号生产</a><br><a href="http://weharmonyos.com/blog/50.html" target="_blank" rel="noopener noreferrer">信号消费</a><br><a href="http://weharmonyos.com/blog/51.html" target="_blank" rel="noopener noreferrer">消息队列</a><br><a href="http://weharmonyos.com/blog/52.html" target="_blank" rel="noopener noreferrer">消息封装</a><br><a href="http://weharmonyos.com/blog/53.html" target="_blank" rel="noopener noreferrer">消息映射</a><br><a href="http://weharmonyos.com/blog/54.html" target="_blank" rel="noopener noreferrer">共享内存</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/55.html" target="_blank" rel="noopener noreferrer">文件概念</a><br><a href="http://weharmonyos.com/blog/56.html" target="_blank" rel="noopener noreferrer">文件故事</a><br><a href="http://weharmonyos.com/blog/57.html" target="_blank" rel="noopener noreferrer">索引节点</a><br><a href="http://weharmonyos.com/blog/58.html" target="_blank" rel="noopener noreferrer">VFS</a><br><a href="http://weharmonyos.com/blog/59.html" target="_blank" rel="noopener noreferrer">文件句柄</a><br><a href="http://weharmonyos.com/blog/60.html" target="_blank" rel="noopener noreferrer">根文件系统</a><br><a href="http://weharmonyos.com/blog/61.html" target="_blank" rel="noopener noreferrer">挂载机制</a><br><a href="http://weharmonyos.com/blog/62.html" target="_blank" rel="noopener noreferrer">管道文件</a><br><a href="http://weharmonyos.com/blog/63.html" target="_blank" rel="noopener noreferrer">文件映射</a><br><a href="http://weharmonyos.com/blog/64.html" target="_blank" rel="noopener noreferrer">写时拷贝</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/65.html" target="_blank" rel="noopener noreferrer">芯片模式</a><br><a href="http://weharmonyos.com/blog/66.html" target="_blank" rel="noopener noreferrer">ARM架构</a><br><a href="http://weharmonyos.com/blog/67.html" target="_blank" rel="noopener noreferrer">指令集</a><br><a href="http://weharmonyos.com/blog/68.html" target="_blank" rel="noopener noreferrer">协处理器</a><br><a href="http://weharmonyos.com/blog/69.html" target="_blank" rel="noopener noreferrer">工作模式</a><br><a href="http://weharmonyos.com/blog/70.html" target="_blank" rel="noopener noreferrer">寄存器</a><br><a href="http://weharmonyos.com/blog/71.html" target="_blank" rel="noopener noreferrer">多核管理</a><br><a href="http://weharmonyos.com/blog/72.html" target="_blank" rel="noopener noreferrer">中断概念</a><br><a href="http://weharmonyos.com/blog/73.html" target="_blank" rel="noopener noreferrer">中断管理</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/74.html" target="_blank" rel="noopener noreferrer">编码方式</a><br><a href="http://weharmonyos.com/blog/75.html" target="_blank" rel="noopener noreferrer">汇编基础</a><br><a href="http://weharmonyos.com/blog/76.html" target="_blank" rel="noopener noreferrer">汇编传参</a><br><a href="http://weharmonyos.com/blog/77.html" target="_blank" rel="noopener noreferrer">链接脚本</a><br><a href="http://weharmonyos.com/blog/78.html" target="_blank" rel="noopener noreferrer">内核启动</a><br><a href="http://weharmonyos.com/blog/79.html" target="_blank" rel="noopener noreferrer">进程切换</a><br><a href="http://weharmonyos.com/blog/80.html" target="_blank" rel="noopener noreferrer">任务切换</a><br><a href="http://weharmonyos.com/blog/81.html" target="_blank" rel="noopener noreferrer">中断切换</a><br><a href="http://weharmonyos.com/blog/82.html" target="_blank" rel="noopener noreferrer">异常接管</a><br><a href="http://weharmonyos.com/blog/83.html" target="_blank" rel="noopener noreferrer">缺页中断</a><br></td></tr> <tr><td style="text-align:center;">编译运行</td> <td style="text-align:center;">调测工具</td> <td style="text-align:center;"></td> <td style="text-align:center;"></td></tr> <tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/84.html" target="_blank" rel="noopener noreferrer">编译过程</a><br><a href="http://weharmonyos.com/blog/85.html" target="_blank" rel="noopener noreferrer">编译构建</a><br><a href="http://weharmonyos.com/blog/86.html" target="_blank" rel="noopener noreferrer">GN语法</a><br><a href="http://weharmonyos.com/blog/87.html" target="_blank" rel="noopener noreferrer">忍者无敌</a><br><a href="http://weharmonyos.com/blog/88.html" target="_blank" rel="noopener noreferrer">ELF格式</a><br><a href="http://weharmonyos.com/blog/89.html" target="_blank" rel="noopener noreferrer">ELF解析</a><br><a href="http://weharmonyos.com/blog/90.html" target="_blank" rel="noopener noreferrer">静态链接</a><br><a href="http://weharmonyos.com/blog/91.html" target="_blank" rel="noopener noreferrer">重定位</a><br><a href="http://weharmonyos.com/blog/92.html" target="_blank" rel="noopener noreferrer">动态链接</a><br><a href="http://weharmonyos.com/blog/93.html" target="_blank" rel="noopener noreferrer">进程映像</a><br><a href="http://weharmonyos.com/blog/94.html" target="_blank" rel="noopener noreferrer">应用启动</a><br><a href="http://weharmonyos.com/blog/95.html" target="_blank" rel="noopener noreferrer">系统调用</a><br><a href="http://weharmonyos.com/blog/96.html" target="_blank" rel="noopener noreferrer">VDSO</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/97.html" target="_blank" rel="noopener noreferrer">模块监控</a><br><a href="http://weharmonyos.com/blog/98.html" target="_blank" rel="noopener noreferrer">日志跟踪</a><br><a href="http://weharmonyos.com/blog/99.html" target="_blank" rel="noopener noreferrer">系统安全</a><br><a href="http://weharmonyos.com/blog/100.html" target="_blank" rel="noopener noreferrer">测试用例</a><br></td> <td style="text-align:center;"></td> <td style="text-align:center;"></td></tr></tbody></table> <h3 id="百万注源码-处处扣细节">百万注源码 | 处处扣细节</h3> <ul><li><p>百万汉字注解内核目的是要看清楚其毛细血管，细胞结构，等于在拿放大镜看内核。内核并不神秘，带着问题去源码中找答案是很容易上瘾的，你会发现很多文章对一些问题的解读是错误的，或者说不深刻难以自圆其说，你会慢慢形成自己新的解读，而新的解读又会碰到新的问题，如此层层递进，滚滚向前，拿着放大镜根本不愿意放手。</p></li> <li><p><a href="https://gitee.com/weharmony/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">&lt; gitee</a> | <a href="https://github.com/kuangyufei/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">github</a> | <a href="https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files" target="_blank" rel="noopener noreferrer">coding</a> | <a href="https://gitcode.net/kuangyufei/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">gitcode &gt;</a> 四大码仓推送 | 同步官方源码。</p> <p><a href="https://gitee.com/weharmony/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer"><img src="https://gitee.com/weharmony/kernel_liteos_a_note/widgets/widget_card.svg?colors=393222,ebdfc1,fffae5,d8ca9f,393222,a28b40" alt=""></a></p></li></ul> <h3 id="关注不迷路-代码即人生">关注不迷路 | 代码即人生</h3> <p><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/so1so.png" alt=""></p> <ul><li>互联网从业十五年，计算机硕士，技术副总裁</li> <li>关注我，持续更新四十年，即聊技术也聊人生</li> <li>交有趣靠谱的人；做难而正确的事</li> <li>不做作，不炒作，只唯真</li> <li>不唯上，不唯书，只唯实</li></ul> <p><a href="http://weharmonyos.com/donate.html" target="_blank" rel="noopener noreferrer"> &gt;&gt; 捐助名单</a></p> <p>据说喜欢 <strong>点赞 + 分享</strong> 的,后来都成了大神。😃</p></div> <!----> <div class="content__content-bottom"></div> <footer class="page-meta"><!----> <!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/blog/19.html" class="prev"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon prev-icon"><path d="M906.783 588.79c-.02 8.499-6.882 15.36-15.38 15.37l-443.7-.01 75.704 191.682c2.52 6.42.482 13.763-5.038 17.91-5.52 4.168-13.138 4.147-18.616-.092L123.228 524.175a15.362 15.362 0 0 1-6-12.165c0-4.782 2.222-9.277 6-12.185L499.753 210.35a15.388 15.388 0 0 1 9.38-3.195c3.236 0 6.502 1.034 9.236 3.103 5.52 4.147 7.578 11.49 5.038 17.91L447.683 419.84l443.72-.01c8.498.01 15.36 6.881 15.36 15.36l.02 153.6z" fill="currentColor"></path></svg>
        Shell编辑
      </a></span> <span class="next"><a href="/blog/index/3_task.html">
        本章目录
        <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon next-icon"><path d="M906.772 512c0 4.772-2.211 9.267-5.99 12.175L524.257 813.66a15.37 15.37 0 0 1-18.616.092 15.368 15.368 0 0 1-5.038-17.91l75.714-191.672h-443.73c-8.488 0-15.36-6.881-15.36-15.36v-153.6c0-8.489 6.872-15.36 15.36-15.36h443.73l-75.714-191.682a15.358 15.358 0 0 1 5.048-17.91c5.51-4.158 13.128-4.137 18.606.092l376.525 289.485a15.323 15.323 0 0 1 5.99 12.165z" fill="currentColor"></path></svg></a></span></p></div> <!----> <!----> <div class="content__page-bottom"></div></main> <!----></div><div class="global-ui"><!----><!----><div id="pwa-install"><!----> <div id="install-modal-wrapper" style="display:none;"><div class="background"></div> <div class="install-modal"><div class="header"><button aria-label="Close" class="close-button"><svg width="23" height="22" xmlns="http://www.w3.org/2000/svg" class="icon close-icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.12.358a1.224 1.224 0 011.729 0l8.92 8.914L20.686.358a1.224 1.224 0 011.73 1.728L13.497 11l8.92 8.913a1.222 1.222 0 11-1.73 1.729l-8.919-8.913-8.92 8.913a1.224 1.224 0 01-1.729-1.729L10.04 11l-8.92-8.914a1.222 1.222 0 010-1.728z" fill="currentColor"></path></svg></button> <div class="logo"><!----> <div class="title"><h1></h1> <p class="desc">This app can be installed on your PC or mobile device.  This will allow this web app to look and behave like any other installed app.  You will find it in your app lists and be able to pin it to your home screen, start menus or task bars.  This installed web app will also be able to safely interact with other apps and your operating system. </p></div></div></div> <div class="content"><div class="highlight"><!----> <!----></div> <div class="description"><h3>Description</h3> <p></p></div></div> <div class="button-wrapper"><button class="install-button">
        Install <span></span></button> <button class="cancel-button">
        Cancel
      </button></div></div></div></div><div tabindex="-1" role="dialog" aria-hidden="true" class="pswp"><div class="pswp__bg"></div> <div class="pswp__scroll-wrap"><div class="pswp__container"><div class="pswp__item"></div> <div class="pswp__item"></div> <div class="pswp__item"></div></div> <div class="pswp__ui pswp__ui--hidden"><div class="pswp__top-bar"><div class="pswp__counter"></div> <button title="Close" aria-label="Close" class="pswp__button pswp__button--close"></button> <button title="Share" aria-label="Share" class="pswp__button pswp__button--share"></button> <button title="Switch to full screen" aria-label="Switch to full screen" class="pswp__button pswp__button--fs"></button> <button title="Zoom in/out" aria-label="Zoom in/out" class="pswp__button pswp__button--zoom"></button> <div class="pswp__preloader"><div class="pswp__preloader__icn"><div class="pswp__preloader__cut"><div class="pswp__preloader__donut"></div></div></div></div></div> <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"><div class="pswp__share-tooltip"></div></div> <button title="Prev (Arrow Left)" aria-label="Prev (Arrow Left)" class="pswp__button pswp__button--arrow--left"></button> <button title="Next (Arrow Right)" aria-label="Next (Arrow Right)" class="pswp__button pswp__button--arrow--right"></button> <div class="pswp__caption"><div class="pswp__caption__center"></div></div></div></div></div></div></div>
    <script src="/assets/js/app.9a8b95d8.js" defer></script><script src="/assets/js/vendors~layout-Layout.c1e797d4.js" defer></script><script src="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.f75cf258.js" defer></script><script src="/assets/js/page--5bc7d548.eda26865.js" defer></script>
  </body>
</html>
